package com.aizuda.boot.modules.common.constant.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 合同字段枚举类
 * 存储系统中的字段ID和字段名称映射关系
 */
@Getter
@AllArgsConstructor
public enum ContractFieldEnum {
    
    /**
     * 合同金额
     */
    CONTRACT_AMOUNT(1L, "合同金额"),
    
    /**
     * 申请人
     */
    APPLICANT(2L, "申请人"),

    /**
     * 合同经办人
     */
    HANDLER(28L, "合同经办人"),
    
    /**
     * 合同期限
     */
    CONTRACT_TERM(3L, "合同期限"),
    
    /**
     * 合同名称
     */
    CONTRACT_NAME(5L, "合同名称"),
    
    /**
     * 合同说明
     */
    CONTRACT_DESCRIPTION(6L, "合同说明"),
    
    /**
     * 框架协议
     */
    FRAMEWORK_AGREEMENT(7L, "框架协议"),
    
    /**
     * 收支类型
     */
    INCOME_EXPENSE_TYPE(8L, "收支类型"),
    
    /**
     * 计价方式
     */
    PRICING_METHOD(9L, "计价方式"),
    
    /**
     * 预估金额
     */
    ESTIMATED_AMOUNT(10L, "预估金额"),
    
    /**
     * 合同总金额
     */
    CONTRACT_TOTAL_AMOUNT(11L, "合同总金额"),
    
    /**
     * 计费说明
     */
    BILLING_DESCRIPTION(12L, "计费说明"),
    
    /**
     * 合同期限类型
     */
    CONTRACT_TERM_TYPE(13L, "合同期限类型"),
    
    /**
     * 合同期限说明
     */
    CONTRACT_TERM_DESCRIPTION(14L, "合同期限说明"),
    
    /**
     * 合同期限（开始日期）
     */
    CONTRACT_START_DATE(15L, "合同期限（开始日期）"),
    
    /**
     * 对方字段组
     */
    COUNTERPARTY_FIELD_GROUP(16L, "对方字段组"),
    
    /**
     * 我方字段组
     */
    OUR_FIELD_GROUP(17L, "我方字段组"),
    
    /**
     * 对方
     */
    COUNTERPARTY(18L, "对方"),
    
    /**
     * 我方
     */
    OUR_PARTY(19L, "我方"),
    
    /**
     * 主合同
     */
    MAIN_CONTRACT(20L, "主合同"),
    
    /**
     * 合同附件
     */
    CONTRACT_ATTACHMENT(21L, "合同附件"),
    
    /**
     * 其他附件
     */
    OTHER_ATTACHMENT(22L, "其他附件"),
    
    /**
     * 合同编号
     */
    CONTRACT_NUMBER(23L, "合同编号"),
    
    /**
     * 合同期限（结束日期）
     */
    CONTRACT_END_DATE(24L, "合同期限（结束日期）"),
    
    /**
     * 合同类型
     */
    CONTRACT_TYPE(25L, "合同类型"),
    
    /**
     * 申请日期
     */
    APPLICATION_DATE(26L, "申请日期"),
    
    /**
     * 创建方式
     */
    CREATION_METHOD(27L, "创建方式");
    
    /**
     * 字段ID
     */
    private final Long fieldId;
    
    /**
     * 字段名称
     */
    private final String fieldName;
    
    /**
     * 根据字段ID获取字段名称
     * 
     * @param fieldId 字段ID
     * @return 字段名称，如果找不到返回null
     */
    public static String getFieldNameById(Integer fieldId) {
        if (fieldId == null) {
            return null;
        }
        
        for (ContractFieldEnum field : values()) {
            if (field.getFieldId().equals(fieldId)) {
                return field.getFieldName();
            }
        }
        return null;
    }
    
    /**
     * 根据字段ID获取字段名称（Long版本）
     * 
     * @param fieldId 字段ID
     * @return 字段名称，如果找不到返回null
     */
    public static String getFieldNameById(Long fieldId) {
        if (fieldId == null) {
            return null;
        }
        
        for (ContractFieldEnum field : values()) {
            if (field.getFieldId().longValue() == fieldId.longValue()) {
                return field.getFieldName();
            }
        }
        return null;
    }
    
    /**
     * 根据字段名称获取字段ID
     * 
     * @param fieldName 字段名称
     * @return 字段ID，如果找不到返回null
     */
    public static Long getFieldIdByName(String fieldName) {
        if (fieldName == null || fieldName.trim().isEmpty()) {
            return null;
        }
        
        for (ContractFieldEnum field : values()) {
            if (field.getFieldName().equals(fieldName.trim())) {
                return field.getFieldId();
            }
        }
        return null;
    }

    /**
     * 根据字段名称获取字段ID（Long版本）
     * 
     * @param fieldName 字段名称
     * @return 字段ID，如果找不到返回null
     */
    public static Long getFieldIdByNameAsLong(String fieldName) {
        Long fieldId = getFieldIdByName(fieldName);
        return fieldId != null ? fieldId.longValue() : null;
    }
    
    /**
     * 根据字段ID获取枚举对象
     * 
     * @param fieldId 字段ID
     * @return 枚举对象，如果找不到返回null
     */
    public static ContractFieldEnum getByFieldId(Integer fieldId) {
        if (fieldId == null) {
            return null;
        }
        
        for (ContractFieldEnum field : values()) {
            if (field.getFieldId().equals(fieldId)) {
                return field;
            }
        }
        return null;
    }
    
    /**
     * 根据字段ID获取枚举对象（Long版本）
     * 
     * @param fieldId 字段ID
     * @return 枚举对象，如果找不到返回null
     */
    public static ContractFieldEnum getByFieldId(Long fieldId) {
        if (fieldId == null) {
            return null;
        }
        
        for (ContractFieldEnum field : values()) {
            if (field.getFieldId().longValue() == fieldId.longValue()) {
                return field;
            }
        }
        return null;
    }
    
    /**
     * 检查字段ID是否存在
     * 
     * @param fieldId 字段ID
     * @return 是否存在
     */
    public static boolean existsFieldId(Integer fieldId) {
        return getByFieldId(fieldId) != null;
    }
    
    /**
     * 检查字段ID是否存在（Long版本）
     * 
     * @param fieldId 字段ID
     * @return 是否存在
     */
    public static boolean existsFieldId(Long fieldId) {
        return getByFieldId(fieldId) != null;
    }
    
    /**
     * 检查字段名称是否存在
     * 
     * @param fieldName 字段名称
     * @return 是否存在
     */
    public static boolean existsFieldName(String fieldName) {
        return getFieldIdByName(fieldName) != null;
    }
} 